package com.ja10.books;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.example.books.R;

import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.LinearLayout.LayoutParams;

public class LoginActivity extends Activity implements Runnable {
	
	public static final String PREFERENCES_FILE_NAME = "preference";
	SharedPreferences settings;
	public static String loginId;
	public static int state;
	
    private CustomProgressDialog waitDialog;
    private Thread thread;
	
	EditText editMail;
	EditText editPassword;
	String mail;
	String password;
	TextView error;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);
		getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		
		// ネットワーク接続を取得
		// 未接続時アクティビティを閉じる
		ConnectivityManager cm = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
		if(!new NetworkGet(cm).net) {
			Toast toast = new Toast(this);
			toast.setView(makeToast("ネットワークに接続されていません"));
			toast.show();
			finish();
		}
		
		// ログインチェック
		loginCheck();
		
		error = (TextView)findViewById(R.id.textError);
	}
	
	// ログインボタン
	public void login_onClick(View view){
		
		editMail = (EditText)findViewById(R.id.editMail);
		editPassword = (EditText)findViewById(R.id.editPassword);
		
		mail = editMail.getText().toString();
		password = editPassword.getText().toString();
		
		if("".equals(mail) || "".equals(password)) {
			error.setText("メールアドレスとパスワードを入力してください");
		} else {
			error.setText("");
			setWait();
		}
	}
	
	// ログインチェック
	public void loginCheck() {
		settings = getSharedPreferences(PREFERENCES_FILE_NAME, Activity.MODE_PRIVATE);
		loginId = settings.getString("id", "");
		state = settings.getInt("state", 0);
		
		// ログイン済の場合アクティビティを閉じる
		if(!"".equals(loginId) && state == 1) {
			Toast toast = new Toast(this);
			toast.setView(makeToast("ログイン済みです"));
			toast.show();
			finish();
		} else if(!"".equals(loginId)) {
			editMail = (EditText)findViewById(R.id.editMail);
			editMail.setText(loginId);
			editMail.setEnabled(false);
		}
	}
	
	// ログイン
	public void login(String mail, String password) {
		
		// 利用者情報を取得するSQL文を用意
		String sql = "select * from members where delete_flag = 0 and user_id = '" + mail + "'";
		
		Connection con = null;
		Statement smt = null;

		try {
			con = DBManager.getConnection();
			smt = con.createStatement();
			ResultSet rs = smt.executeQuery(sql);
			
			if(rs.first()) {
				// ログイン成功時の処理
				if(password.equals(rs.getString("password"))) {
					
					loginSet(mail);	// ログイン情報をセット
					
				} else {
					error.setText("パスワードが間違っています");
				}
			} else {
				// IDが存在しない、削除されている場合その旨エラー表示
				error.setText("メールアドレスが間違っています");
			}
			rs.close();
			
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			if(smt != null) {
				try {
					smt.close();
				} catch(SQLException ignore) {
					// none
				}
			}
			if(con != null) {
				try {
					con.close();
				} catch(SQLException ignore) {
					// none
				}
			}
		}
	}
	
	// ログイン情報をセット
	public void loginSet(String mail) {
		
		// PreferenceにIDを保存
		SharedPreferences.Editor editor = settings.edit();
		editor.putString("id", mail);
		editor.putInt("state", 1);
		editor.commit();
		
		// ログイン成功を通知しアクティビティを閉じる
		Toast toast = new Toast(this);
		toast.setView(makeToast("ログインしました"));
		toast.show();
		
		// 遷移元からのデータの取得
		Intent i = this.getIntent();
		int m = i.getIntExtra("move", 0);
		String id = i.getStringExtra("id");
		
		
		switch(m) {
			// 書籍予約ボタンから遷移の場合
			case 1:
				i = new Intent(this, ReserveEntry.class);
				i.putExtra("id", id);
				startActivity(i);
				break;
			// 予約取消ボタンから遷移の場合
			case 2:
				break;
			default:
		}
		finish();
	}
	
	private void setWait(){
	    // プログレスダイアログの設定
	    waitDialog = new CustomProgressDialog(this);
	    // プログレスダイアログを表示
	    waitDialog.show();
	 
	    thread = new Thread(this);
	    thread.start();
	}
	
	@Override
	public void run() {
	    try {
	        //ダイアログがしっかり見えるように少しだけスリープ
	        Thread.sleep(3000);
	    } catch (InterruptedException e) {
	        //スレッドの割り込み処理を行った場合に発生、catchの実装は割愛
	    }
	    handler.sendEmptyMessage(0);
	}
	
	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler() {
	    public void handleMessage(Message msg){
	    	
	    	login(mail, password);
	        // プログレスダイアログ終了
	        waitDialog.dismiss();
	        waitDialog = null;
	    }
	};
	
	// キャンセルボタン
	public void cancel_onClick(View view){
		finish();
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	// ダイアログ
	public class CustomProgressDialog extends Dialog {

		public CustomProgressDialog(Context context) {
			super(context,  R.style.Theme_CustomProgressDialog);
			setContentView(R.layout.custom_progress_dialog);
		}
	}
	
	// トースト用TextView作成
	public View makeToast(String message) {
		TextView text = new TextView(this);
		text.setBackgroundColor(Color.BLACK);
		text.setPadding(5, 5, 5, 5);
		text.setText(message);
		return text;
	}

}
